{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"https://raw.githubusercontent.com/Qiskit/qiskit-tutorials/master/images/qiskit-heading.png\" width=\"500 px\" align=\"center\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# _*Qiskit Aqua: Experimenting with Max-Cut problem with variational quantum eigensolver*_ \n",
    "\n",
    "\n",
    "This notebook is based on an official notebook by Qiskit team, available at https://github.com/qiskit/qiskit-tutorial under the [Apache License 2.0](https://github.com/Qiskit/qiskit-tutorial/blob/master/LICENSE) license. \n",
    "The original notebook was developed by Antonio Mezzacapo<sup>[1]</sup>, Jay Gambetta<sup>[1]</sup>, Kristan Temme<sup>[1]</sup>, Ramis Movassagh<sup>[1]</sup>, Albert Frisch<sup>[1]</sup>, Takashi Imamichi<sup>[1]</sup>, Giacomo Nannicni<sup>[1]</sup>, Richard Chen<sup>[1]</sup>, Marco Pistoia<sup>[1]</sup>, Stephen Wood<sup>[1]</sup>(<sup>[1]</sup>IBMQ)\n",
    "\n",
    "Your **TASK** is to execute every step of this notebook while learning to use qiskit-aqua and also how to leverage general problem modeling into know problems that qiskit-aqua can solve, namely the [Maximum Cut problem](https://en.wikipedia.org/wiki/Maximum_cut) problem."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction\n",
    "\n",
    "Many problems in quantitative fields such as finance and engineering are optimization problems. Optimization problems lay at the core of complex decision-making and definition of strategies. \n",
    "\n",
    "Optimization (or combinatorial optimization) means searching for an optimal solution in a finite or countably infinite set of potential solutions. Optimality is defined with respect to some criterion function, which is to be minimized or maximized. This is typically called cost function or objective function. \n",
    "\n",
    "**Typical optimization problems**\n",
    "\n",
    "Minimization: cost, distance, length of a traversal, weight, processing time, material, energy consumption, number of objects\n",
    "\n",
    "Maximization: profit, value, output, return, yield, utility, efficiency, capacity, number of objects \n",
    "\n",
    "We consider here max-cut problem of practical interest in many fields, and show how they can mapped on quantum computers.\n",
    "\n",
    "\n",
    "### Weighted Max-Cut\n",
    "\n",
    "Max-Cut is an NP-complete problem, with applications in clustering, network science, and statistical physics. To grasp how practical applications are mapped into given Max-Cut instances, consider a system of many people that can interact and influence each other. Individuals can be represented by vertices of a graph, and their interactions seen as pairwise connections between vertices of the graph, or edges. With this representation in mind, it is easy to model typical marketing problems. For example, suppose that it is assumed that individuals will influence each other's buying decisions, and knowledge is given about how strong they will influence each other. The influence can be modeled by weights assigned on each edge of the graph. It is possible then to predict the outcome of a marketing strategy in which products are offered for free to some individuals, and then ask which is the optimal subset of individuals that should get the free products, in order to maximize revenues.\n",
    "\n",
    "The formal definition of this problem is the following:\n",
    "\n",
    "Consider an $n$-node undirected graph *G = (V, E)* where *|V| = n* with edge weights $w_{ij}>0$, $w_{ij}=w_{ji}$, for $(i, j)\\in E$. A cut is defined as a partition of the original set V into two subsets. The cost function to be optimized is in this case the sum of weights of edges connecting points in the two different subsets, *crossing* the cut. By assigning $x_i=0$ or $x_i=1$ to each node $i$, one tries to maximize the global profit function (here and in the following summations run over indices 0,1,...n-1)\n",
    "\n",
    "$$\\tilde{C}(\\textbf{x}) = \\sum_{i,j} w_{ij} x_i (1-x_j).$$\n",
    "\n",
    "In our simple marketing model, $w_{ij}$ represents the probability that the person $j$ will buy a product after $i$ gets a free one. Note that the weights $w_{ij}$ can in principle be greater than $1$, corresponding to the case where the individual $j$ will buy more than one product. Maximizing the total buying probability corresponds to maximizing the total future revenues. In the case where the profit probability will be greater than the cost of the initial free samples, the strategy is a convenient one. An extension to this model has the nodes themselves carry weights, which can be regarded, in our marketing model, as the likelihood that a person granted with a free sample of the product will buy it again in the future. With this additional information in our model, the objective function to maximize becomes \n",
    "\n",
    "$$C(\\textbf{x}) = \\sum_{i,j} w_{ij} x_i (1-x_j)+\\sum_i w_i x_i. $$\n",
    " \n",
    "In order to find a solution to this problem on a quantum computer, one needs first to map it to an Ising Hamiltonian. This can be done with the assignment $x_i\\rightarrow (1-Z_i)/2$, where $Z_i$ is the Pauli Z operator that has eigenvalues $\\pm 1$. Doing this we find that \n",
    "\n",
    "$$C(\\textbf{Z}) = \\sum_{i,j} \\frac{w_{ij}}{4} (1-Z_i)(1+Z_j) + \\sum_i \\frac{w_i}{2} (1-Z_i) = -\\frac{1}{2}\\left( \\sum_{i<j} w_{ij} Z_i Z_j +\\sum_i w_i Z_i\\right)+\\mathrm{const},$$\n",
    "\n",
    "where const = $\\sum_{i<j}w_{ij}/2+\\sum_i w_i/2 $. In other terms, the weighted Max-Cut problem is equivalent to minimizing the Ising Hamiltonian \n",
    "\n",
    "$$ H = \\sum_i w_i Z_i + \\sum_{i<j} w_{ij} Z_iZ_j.$$\n",
    "\n",
    "Aqua can generate the Ising Hamiltonian for the first profit function $\\tilde{C}$.\n",
    "\n",
    "\n",
    "### Approximate Universal Quantum Computing for Optimization Problems\n",
    "\n",
    "There has been a considerable amount of interest in recent times about the use of quantum computers to find a solution to combinatorial problems. It is important to say that, given the classical nature of combinatorial problems, exponential speedup in using quantum computers compared to the best classical algorithms is not guaranteed. However, due to the nature and importance of the target problems, it is worth investigating heuristic approaches on a quantum computer that could indeed speed up some problem instances. Here we demonstrate an approach that is based on the Quantum Approximate Optimization Algorithm by Farhi, Goldstone, and Gutman (2014). We frame the algorithm in the context of *approximate quantum computing*, given its heuristic nature. \n",
    "\n",
    "The Algorithm works as follows:\n",
    "1. Choose the $w_i$ and $w_{ij}$ in the target Ising problem. In principle, even higher powers of Z are allowed.\n",
    "2. Choose the depth of the quantum circuit $m$. Note that the depth can be modified adaptively.\n",
    "3. Choose a set of controls $\\theta$ and make a trial function $|\\psi(\\boldsymbol\\theta)\\rangle$, built using a quantum circuit made of C-Phase gates and single-qubit Y rotations, parameterized by the components of $\\boldsymbol\\theta$. \n",
    "4. Evaluate $C(\\boldsymbol\\theta) = \\langle\\psi(\\boldsymbol\\theta)~|H|~\\psi(\\boldsymbol\\theta)\\rangle = \\sum_i w_i \\langle\\psi(\\boldsymbol\\theta)~|Z_i|~\\psi(\\boldsymbol\\theta)\\rangle+ \\sum_{i<j} w_{ij} \\langle\\psi(\\boldsymbol\\theta)~|Z_iZ_j|~\\psi(\\boldsymbol\\theta)\\rangle$ by sampling the outcome of the circuit in the Z-basis and adding the expectation values of the individual Ising terms together. In general, different control points around $\\boldsymbol\\theta$ have to be estimated, depending on the classical optimizer chosen. \n",
    "5. Use a classical optimizer to choose a new set of controls.\n",
    "6. Continue until $C(\\boldsymbol\\theta)$ reaches a minimum, close enough to the solution $\\boldsymbol\\theta^*$.\n",
    "7. Use the last $\\boldsymbol\\theta$ to generate a final set of samples from the distribution $|\\langle z_i~|\\psi(\\boldsymbol\\theta)\\rangle|^2\\;\\forall i$ to obtain the answer.\n",
    "    \n",
    "It is our belief the difficulty of finding good heuristic algorithms will come down to the choice of an appropriate trial wavefunction. For example, one could consider a trial function whose entanglement best aligns with the target problem, or simply make the amount of entanglement a variable. In this tutorial, we will consider a simple trial function of the form\n",
    "\n",
    "$$|\\psi(\\theta)\\rangle  = [U_\\mathrm{single}(\\boldsymbol\\theta) U_\\mathrm{entangler}]^m |+\\rangle$$\n",
    "\n",
    "where $U_\\mathrm{entangler}$ is a collection of C-Phase gates (fully entangling gates), and $U_\\mathrm{single}(\\theta) = \\prod_{i=1}^n Y(\\theta_{i})$, where $n$ is the number of qubits and $m$ is the depth of the quantum circuit. The motivation for this choice is that for these classical problems this choice allows us to search over the space of quantum states that have only real coefficients, still exploiting the entanglement to potentially converge faster to the solution.\n",
    "\n",
    "One advantage of using this sampling method compared to adiabatic approaches is that the target Ising Hamiltonian does not have to be implemented directly on hardware, allowing this algorithm not to be limited to the connectivity of the device. Furthermore, higher-order terms in the cost function, such as $Z_iZ_jZ_k$, can also be sampled efficiently, whereas in adiabatic or annealing approaches they are generally impractical to deal with. \n",
    "\n",
    "\n",
    "References:\n",
    "- A. Lucas, Frontiers in Physics 2, 5 (2014)\n",
    "- E. Farhi, J. Goldstone, S. Gutmann e-print arXiv 1411.4028 (2014)\n",
    "- D. Wecker, M. B. Hastings, M. Troyer Phys. Rev. A 94, 022309 (2016)\n",
    "- E. Farhi, J. Goldstone, S. Gutmann, H. Neven e-print arXiv 1703.06199 (2017)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# useful additional packages \n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.axes as axes\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import networkx as nx\n",
    "\n",
    "from qiskit.tools.visualization import plot_histogram\n",
    "from qiskit.aqua import Operator, run_algorithm\n",
    "from qiskit.aqua.input import EnergyInput\n",
    "from qiskit.aqua.translators.ising import max_cut, tsp\n",
    "\n",
    "# setup aqua logging\n",
    "import logging\n",
    "from qiskit.aqua._logging import set_logging_config, build_logging_config\n",
    "# set_logging_config(build_logging_config(logging.DEBUG))  # choose INFO, DEBUG to see the log\n",
    "\n",
    "# ignoring deprecation errors on matplotlib\n",
    "import warnings\n",
    "import matplotlib.cbook\n",
    "warnings.filterwarnings(\"ignore\",category=matplotlib.cbook.mplDeprecation)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### [Optional] Setup token to run the experiment on a real device\n",
    "If you would like to run the experiement on a real device, you need to setup your account first.\n",
    "\n",
    "Note: If you do not store your token yet, use `IBMQ.save_accounts()` to store it first."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit import IBMQ\n",
    "# IBMQ.load_account()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Max-Cut problem"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Generating a graph of 4 nodes \n",
    "\n",
    "n=4 # Number of nodes in graph\n",
    "G=nx.Graph()\n",
    "G.add_nodes_from(np.arange(0,n,1))\n",
    "elist=[(0,1,1.0),(0,2,1.0),(0,3,1.0),(1,2,1.0),(2,3,1.0)]\n",
    "# tuple is (i,j,weight) where (i,j) is the edge\n",
    "G.add_weighted_edges_from(elist)\n",
    "\n",
    "colors = ['r' for node in G.nodes()]\n",
    "pos = nx.spring_layout(G)\n",
    "default_axes = plt.axes(frameon=True)\n",
    "nx.draw_networkx(G, node_color=colors, node_size=600, alpha=.8, ax=default_axes, pos=pos)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0. 1. 1. 1.]\n",
      " [1. 0. 1. 0.]\n",
      " [1. 1. 0. 1.]\n",
      " [1. 0. 1. 0.]]\n"
     ]
    }
   ],
   "source": [
    "# Computing the weight matrix from the random graph\n",
    "w = np.zeros([n,n])\n",
    "for i in range(n):\n",
    "    for j in range(n):\n",
    "        temp = G.get_edge_data(i,j,default=0)\n",
    "        if temp != 0:\n",
    "            w[i,j] = temp['weight'] \n",
    "print(w)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Brute force approach\n",
    "\n",
    "Try all possible $2^n$ combinations. For $n = 4$, as in this example, one deals with only 16 combinations, but for n = 1000, one has 1.071509e+30 combinations, which is impractical to deal with by using a brute force approach. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "case = [0, 0, 0, 0] cost = 0.0\n",
      "case = [1, 0, 0, 0] cost = 3.0\n",
      "case = [0, 1, 0, 0] cost = 2.0\n",
      "case = [1, 1, 0, 0] cost = 3.0\n",
      "case = [0, 0, 1, 0] cost = 3.0\n",
      "case = [1, 0, 1, 0] cost = 4.0\n",
      "case = [0, 1, 1, 0] cost = 3.0\n",
      "case = [1, 1, 1, 0] cost = 2.0\n",
      "case = [0, 0, 0, 1] cost = 2.0\n",
      "case = [1, 0, 0, 1] cost = 3.0\n",
      "case = [0, 1, 0, 1] cost = 4.0\n",
      "case = [1, 1, 0, 1] cost = 3.0\n",
      "case = [0, 0, 1, 1] cost = 3.0\n",
      "case = [1, 0, 1, 1] cost = 2.0\n",
      "case = [0, 1, 1, 1] cost = 3.0\n",
      "case = [1, 1, 1, 1] cost = 0.0\n",
      "\n",
      "Best solution = [1, 0, 1, 0] cost = 4.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "best_cost_brute = 0\n",
    "for b in range(2**n):\n",
    "    x = [int(t) for t in reversed(list(bin(b)[2:].zfill(n)))]\n",
    "    cost = 0\n",
    "    for i in range(n):\n",
    "        for j in range(n):\n",
    "            cost = cost + w[i,j]*x[i]*(1-x[j])\n",
    "    if best_cost_brute < cost:\n",
    "        best_cost_brute = cost\n",
    "        xbest_brute = x \n",
    "    print('case = ' + str(x)+ ' cost = ' + str(cost))\n",
    "\n",
    "colors = ['r' if xbest_brute[i] == 0 else 'b' for i in range(n)]\n",
    "nx.draw_networkx(G, node_color=colors, node_size=600, alpha=.8, pos=pos)\n",
    "print('\\nBest solution = ' + str(xbest_brute) + ' cost = ' + str(best_cost_brute))    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Mapping to the Ising problem"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "qubitOp, offset = max_cut.get_max_cut_qubitops(w)\n",
    "algo_input = EnergyInput(qubitOp)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Checking that the full Hamiltonian gives the right cost "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "energy: -1.5\n",
      "max-cut objective: -4.0\n",
      "solution: [0. 1. 0. 1.]\n",
      "solution objective: 4.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Making the Hamiltonian in its full form and getting the lowest eigenvalue and eigenvector\n",
    "\n",
    "algorithm_cfg = {\n",
    "    'name': 'ExactEigensolver',\n",
    "}\n",
    "\n",
    "params = {\n",
    "    'problem': {'name': 'ising'},\n",
    "    'algorithm': algorithm_cfg\n",
    "}\n",
    "result = run_algorithm(params,algo_input)\n",
    "x = max_cut.sample_most_likely(result['eigvecs'][0])\n",
    "print('energy:', result['energy'])\n",
    "print('max-cut objective:', result['energy'] + offset)\n",
    "print('solution:', max_cut.get_graph_solution(x))\n",
    "print('solution objective:', max_cut.max_cut_value(x, w))\n",
    "\n",
    "colors = ['r' if max_cut.get_graph_solution(x)[i] == 0 else 'b' for i in range(n)]\n",
    "nx.draw_networkx(G, node_color=colors, node_size=600, alpha = .8, pos=pos)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Running it on quantum computer\n",
    "We run the optimization routine using a feedback loop with a quantum computer that uses trial functions built with Y single-qubit rotations, $U_\\mathrm{single}(\\theta) = \\prod_{i=1}^n Y(\\theta_{i})$, and entangler steps $U_\\mathrm{entangler}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "energy: -1.4995485513056617\n",
      "time: 8.994375944137573\n",
      "max-cut objective: -3.9995485513056614\n",
      "solution: [0. 1. 0. 1.]\n",
      "solution objective: 4.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "algorithm_cfg = {\n",
    "    'name': 'VQE',\n",
    "    'operator_mode': 'matrix'\n",
    "}\n",
    "\n",
    "optimizer_cfg = {\n",
    "    'name': 'SPSA',\n",
    "    'max_trials': 300\n",
    "}\n",
    "\n",
    "var_form_cfg = {\n",
    "    'name': 'RY',\n",
    "    'depth': 5,\n",
    "    'entanglement': 'linear'\n",
    "}\n",
    "\n",
    "params = {\n",
    "    'problem': {'name': 'ising', 'random_seed': 10598},\n",
    "    'algorithm': algorithm_cfg,\n",
    "    'optimizer': optimizer_cfg,\n",
    "    'variational_form': var_form_cfg,\n",
    "    'backend': {'name': 'statevector_simulator'}\n",
    "}\n",
    "\n",
    "result = run_algorithm(params, algo_input)\n",
    "\n",
    "x = max_cut.sample_most_likely(result['eigvecs'][0])\n",
    "print('energy:', result['energy'])\n",
    "print('time:', result['eval_time'])\n",
    "print('max-cut objective:', result['energy'] + offset)\n",
    "print('solution:', max_cut.get_graph_solution(x))\n",
    "print('solution objective:', max_cut.max_cut_value(x, w))\n",
    "\n",
    "colors = ['r' if max_cut.get_graph_solution(x)[i] == 0 else 'b' for i in range(n)]\n",
    "nx.draw_networkx(G, node_color=colors, node_size=600, alpha = .8, pos=pos)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "energy: -1.5\n",
      "time: 18.19207787513733\n",
      "max-cut objective: -4.0\n",
      "solution: [1 0 1 0]\n",
      "solution objective: 4.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# run quantum algorithm with shots\n",
    "params['algorithm']['operator_mode'] = 'grouped_paulis'\n",
    "params['backend']['name'] = 'qasm_simulator'\n",
    "params['backend']['shots'] = 1024\n",
    "\n",
    "result = run_algorithm(params, algo_input)\n",
    "x = max_cut.sample_most_likely(result['eigvecs'][0])\n",
    "print('energy:', result['energy'])\n",
    "print('time:', result['eval_time'])\n",
    "print('max-cut objective:', result['energy'] + offset)\n",
    "print('solution:', max_cut.get_graph_solution(x))\n",
    "print('solution objective:', max_cut.max_cut_value(x, w))\n",
    "plot_histogram(result['eigvecs'][0])\n",
    "\n",
    "colors = ['r' if max_cut.get_graph_solution(x)[i] == 0 else 'b' for i in range(n)]\n",
    "nx.draw_networkx(G, node_color=colors, node_size=600, alpha = .8, pos=pos)"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
